package com.second.app.thread.p_c_callwait;

/**
 * @Author soul yzg
 * @Date 2021/1/26 7:14
 * 努力学习 天天进步
 * 生产和消费线程呈现n-n的情况，最终会出现线程假死的状态。所有线程都在waiting。
 *  假设生产者1进入生产，生产完毕后发出通知（此时属于“通知过早”，因为消费线程还没有开始运行）,释放锁，准备进入下一次的while循环。
 *  生产者1进入了下一次while循环，迅速持有锁，此时发现刚才生产的产品并没有被消费掉，所以生产者1就呈现等待状态。
 *  生产者2线程启动后，发现产品没有被消费掉，所以生产者2也呈现等待状态。
 *  消费者2被start启动后，消费者2持有锁，将产品消费掉，并唤醒生产者1，运行结束后释放锁，消费者2进入下一次循环。
 *  消费者2进入下一次的while循环，并且持有锁，发现产品未生产，所以释放锁，呈等待状态。
 *  消费者1start后，持有锁，发现产品没有生产，便释放锁进入等待状态。
 *
 *  由于消费者2将产品消费掉的时候，唤醒生产者1去生产，并释放锁，并发出通知唤醒生产者2，生产者1准备进入下一次的while循环
 *  这时候生产者1进入下一次的while循环再次持有锁，发现产品还未消费，所以生产者1也呈等待状态。生产者2发现产品还未消费，所以生产者2也呈等待状态。
 *
 */
public class Consumer {

    private String lock ="";

    public Consumer(String lock){
        this.lock =lock;
    }

    public void getValue(){
        synchronized (lock){
            try {
                if(ValueObject.getValue().equals("")){
                    System.out.println("消费者"+Thread.currentThread().getName()+":WAITING 了");
                    lock.wait();
                }
                System.out.println("消费者"+Thread.currentThread().getName()+":RUNNABLE 了");
                //消费完成，置空，再通知生成线程生产
                ValueObject.setValue("");
                lock.notifyAll();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

